package com.liao.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.liao.dto.LoginDTO;
import com.liao.dto.RegisterDTO;
import com.liao.entity.User;
import com.liao.mapper.UserMapper;
import com.liao.service.UserService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

/**
 * 用户服务实现类
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    /**
     * 用户登录
     *
     * @param loginDTO 登录信息
     * @return 登录成功的用户信息
     */
    @Override
    public User login(LoginDTO loginDTO) {
        // 根据用户名查询用户
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(User::getUsername, loginDTO.getUsername());
        User user = this.getOne(queryWrapper);
        
        // 用户不存在或密码不匹配
        if (user == null || !user.getPassword().equals(loginDTO.getPassword())) {
            throw new RuntimeException("用户名或密码错误");
        }
        
        // 账号被禁用
        if (user.getStatus() == 0) {
            throw new RuntimeException("账号已被禁用");
        }
        
        // 登录成功，清除密码
        user.setPassword(null);
        return user;
    }

    /**
     * 用户注册
     *
     * @param registerDTO 注册信息
     * @return 注册成功的用户信息
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public User register(RegisterDTO registerDTO) {
        // 检查用户名是否已存在
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(User::getUsername, registerDTO.getUsername());
        if (this.count(queryWrapper) > 0) {
            throw new RuntimeException("用户名已存在");
        }
        
        // 创建新用户
        User user = new User();
        user.setUsername(registerDTO.getUsername());
        user.setPassword(registerDTO.getPassword());
        user.setEmail(registerDTO.getEmail());
        user.setName("测试用户");
        user.setRole("user"); // 默认为普通用户
        user.setStatus(1); // 默认启用
        
        // 保存用户
        this.save(user);
        
        // 返回用户信息，清除密码
        user.setPassword(null);
        return user;
    }

    /**
     * 分页查询用户列表
     *
     * @param page     分页参数
     * @param username 用户名（可选）
     * @param name     姓名（可选）
     * @param role     角色（可选）
     * @return 分页用户列表
     */
    @Override
    public Page<User> getUserPage(Page<User> page, String username, String name, String role) {
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        
        // 添加查询条件
        queryWrapper.like(StringUtils.hasText(username), User::getUsername, username)
                .like(StringUtils.hasText(name), User::getName, name)
                .eq(StringUtils.hasText(role), User::getRole, role);
        
        // 查询并返回结果
        Page<User> userPage = this.page(page, queryWrapper);
        
        // 清除密码
        userPage.getRecords().forEach(user -> user.setPassword(null));
        
        return userPage;
    }

    /**
     * 修改用户状态
     *
     * @param id     用户ID
     * @param status 状态：0-禁用，1-正常
     * @return 是否成功
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean updateStatus(Long id, Integer status) {
        User user = this.getById(id);
        if (user == null) {
            throw new RuntimeException("用户不存在");
        }
        
        user.setStatus(status);
        return this.updateById(user);
    }

    /**
     * 重置密码
     *
     * @param id 用户ID
     * @return 是否成功
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean resetPassword(Long id) {
        User user = this.getById(id);
        if (user == null) {
            throw new RuntimeException("用户不存在");
        }
        
        // 重置为默认密码123456
        user.setPassword("123456");
        return this.updateById(user);
    }
}